package com.niodata.dp.core.usermgr.op;

import com.niodata.dp.core.usermgr.DpUsermgrException;
import com.niodata.dp.core.usermgr.enums.AuthType;
import com.niodata.dp.core.usermgr.enums.GroupRole;
import com.niodata.dp.core.usermgr.model.GroupInfo;
import com.niodata.dp.core.usermgr.model.GroupProfile;
import com.niodata.dp.core.usermgr.model.UserGroup;
import com.niodata.dp.core.usermgr.model.UserGroupInfo;
import com.niodata.dp.core.usermgr.model.UserInfo;
import com.niodata.dp.core.usermgr.model.result.GroupResult;
import java.util.List;

/**
 * 组相关接口.
 */
public interface GroupInfoService {

  /**
   * 创建组.
   *
   * @param groupInfo 组信息
   * @param ownerId ownerId
   * @throws DpUsermgrException 用户管理模块异常
   */
  long createGroup(GroupInfo groupInfo, Long ownerId, boolean mappToHdfs)
        throws DpUsermgrException;


  /**
   * 根据组ID删除组.
   *
   * @param groupId 组ID
   * @throws DpUsermgrException 用户管理模块异常
   */
  void removeGroup(Long groupId) throws DpUsermgrException;


  void resetGroupOwner(Long groupId, Long newOwnerUserId) throws DpUsermgrException;

  void addUserToGroup(Long groupId, Long userId, GroupRole role) throws DpUsermgrException;

  /**
   * 用户添加进组.
   *
   * @param userIds 用户IDs
   * @param groupId 组ID
   * @throws DpUsermgrException 用户管理模块异常
   */
  void addUserToGroup(List<Long> userIds, Long groupId, GroupRole role)
        throws DpUsermgrException;

  void removeUserFromGroup(Long groupId, Long userId) throws DpUsermgrException;

  /**
   * 用户从组中移除.
   *
   * @param userIds 用户IDs
   * @param groupId 组ID
   * @throws DpUsermgrException 用户管理模块异常
   */
  void removeUserFromGroup(List<Long> userIds, Long groupId) throws DpUsermgrException;

  UserInfo getGroupOwner(Long groupId) throws DpUsermgrException;

  //  /**
  //   * 更改组的所有者.
  //   *
  //   * @param groupId 组ID
  //   * @param newUserId 新Master的用户Id
  //   * @throws DpUsermgrException 用户管理模块异常
  //   */
  //  void modifyGroupMaster(Long groupId, Long newUserId) throws DpUsermgrException;

  /**
   * 修改组的信息.
   *
   * @param groupInfo 组信息
   * @throws DpUsermgrException 用户管理模块异常
   */
  void updateGroupInfo(GroupInfo groupInfo) throws DpUsermgrException;

  /**
   * 根据组ID查询组信息.
   *
   * @param groupId 组ID
   * @return GroupInfo 组信息
   * @throws DpUsermgrException 用户管理模块异常
   */
  GroupInfo getGroupInfo(Long groupId) throws DpUsermgrException;

  /**
   * 根据组名查询组信息.
   *
   * @param groupName 组名
   * @return GroupInfo 组信息
   * @throws DpUsermgrException 用户管理模块异常
   */
  GroupInfo getGroupInfo(String groupName) throws DpUsermgrException;

  /**
   * 获取所有组数量.
   *
   * @return 组信息数量
   * @throws DpUsermgrException 用户管理模块异常
   */
  int getGroupCount() throws DpUsermgrException;

  /**
   * 获取所有组信息.
   *
   * @param pageIndex 第几页
   * @param pageSize 每页多少条
   * @return 组信息列表
   * @throws DpUsermgrException 用户管理模块异常
   */
  List<GroupResult> getAllGroups(int pageIndex, int pageSize) throws DpUsermgrException;

  /**
   * 获取用户所在组信息.
   *
   * @param userId 用户ID
   * @return 组信息列表
   * @throws DpUsermgrException 用户管理模块异常
   */
  List<GroupInfo> getAllGroups(Long userId) throws DpUsermgrException;

  /**
   * 根据Relation查询GroupInfo List.
   *
   * @param userGroupList Relation列表
   * @return 组信息列表
   * @throws DpUsermgrException 用户管理模块异常
   */
  List<GroupInfo> getAllGroups(List<UserGroup> userGroupList) throws DpUsermgrException;


  /**
   * 获取用户为Owner所在组信息.
   *
   * @param userId 用户ID
   * @return 组信息列表
   * @throws DpUsermgrException 用户管理模块异常
   */
  List<GroupResult> getOwnerGroups(Long userId) throws DpUsermgrException;

  List<GroupResult> getOwnerOrMasterGroups(Long userId) throws DpUsermgrException;


  /**
   * 获取用户所在组角色.
   *
   * @param userId 用户ID
   * @return 组角色列表
   * @throws DpUsermgrException 用户管理模块异常
   */
  List<UserGroup> getUserGroups(Long userId) throws DpUsermgrException;

  List<UserGroupInfo> getUserGroupInfoOfGroup(Long groupId);

  boolean checkUserInGroup(Long userId, Long groupId) throws DpUsermgrException;

  /**
   * 判断用户是否是某组Owner.
   *
   * @param userId 用户ID
   * @param groupId 组ID
   * @return 是否为Master
   * @throws DpUsermgrException 用户管理模块异常
   */
  boolean isOwner(Long userId, Long groupId) throws DpUsermgrException;

  UserGroup getUserGroupInfo(Long userId, Long groupId) throws DpUsermgrException;

  boolean isMasterOrOwner(Long userId, Long groupId) throws DpUsermgrException;


  /**
   * 从资源信息解析得到组信息.
   *
   * @param authType 资源类型
   * @param authPath 资源路径
   * @return 组信息
   * @throws DpUsermgrException 用户管理模块异常
   */
  GroupInfo resolveResource(AuthType authType, String authPath) throws DpUsermgrException;

  List<GroupInfo> searchGroupByName(String nameKeyWord);


  void createOrUpdateProfile(long groupId, GroupProfile profileG);

}
